package com.yhh.yapidemointerface.controller;

import com.yhh.yapiclientsdk.model.User;
import com.yhh.yapiclientsdk.utils.SignUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * @author hyh
 * @date 2024/8/6
 * @description
 * 模拟第三方提供的接口
 */
@RestController
@RequestMapping("/name")
public class NameController {
    @GetMapping("/get")
    public String getNameByGet(String name) {
        return "GET 你的名字是" + name;
    }

    @PostMapping("/post")
    public String getNameByPost(@RequestParam String name) {
        return "POST 你的名字是" + name;
    }

    @PostMapping("/user")
    public String getUserNameByPost(@RequestBody User user, HttpServletRequest request) {
//        String accessKey = request.getHeader("accessKey");
////        String secretKey = request.getHeader("secretKey");
//        String body = request.getHeader("body");
//        String nonce = request.getHeader("nonce");
//        String timestamp = request.getHeader("timestamp");
//        String sign = request.getHeader("sign");

        /*
        加入一个时间戳（timestamp）。每个请求在发送时携带一个时间戳，
        并且后端会验证该时间戳是否在指定的时间范围内，例如不超过10分钟或5分钟。
        这可以防止对方使用昨天的请求在今天进行重放。
        通过这种方式，可以一定程度上控制随机数的过期时间。
        因为后端需要同时验证这两个参数，只要时间戳过期或随机数被使用过，后端会拒绝该请求。
        因此，时间戳可以在一定程度上减轻后端保存随机数的负担。
         */
        // 时间和当前时间不能超过五分钟
//        long currentTime = System.currentTimeMillis();
//        long timestampValue = Long.parseLong(timestamp);
//        if (currentTime - timestampValue > 5 * 60 * 1000) {
//            throw new RuntimeException("时间超过五分钟");
//        }

        // todo 校验随机数
        // todo 存储随机数，解决重放攻击的问题，后端存储用hashmap或redis都可以
        /*
        加入一个随机数实现标准的签名认证。
        每次请求时，发送一个随机数给后端。
        后端只接受并认可该随机数一次，一旦随机数被使用过，后端将不再接受相同的随机数。
        这种方式解决了请求重放的问题，因为即使对方使用之前的时间和随机数进行请求，
        后端会认识到该请求已经被处理过，不会再次处理。然而，这种方法需要后端额外开发来保存已使用的随机数。
        并且，如果接口的并发量很大，每次请求都需要一个随机数，那么可能会面临处理百万、千万甚至亿级别请求的情况
        所以需要配合时间戳来完成
         */

        // 校验ak
//        // todo 去数据库中查询
//        if (!accessKey.equals("xuan")) {
//            throw new RuntimeException("无权限访问接口");
//        }
//
//        // 校验签名
//        // todo 去数据库中查询
//        String serverSign = SignUtils.getSign(body, "abcdefg");
//        if (!sign.equals(serverSign)) {
//            throw new RuntimeException("无访问权限");
//        }
        return "POST 用户名字是" + user.getUsername();
    }

    @GetMapping("/")
    public String getName(String name, HttpServletRequest request) {
        System.out.println(request.getHeader("xuan"));
        return "Get 你的名字是：" + name;
    }

}
